/**
 * 统计注册类
 */
export default class AcRegisterClass {
	/**
	 * 调试模式
	 */
	debug = true;
	/**
	 * 接口主机地址
	 */
	host = '';
	/**
	 * 应用id 通过统计后台获得
	 * (对应平台id)
	 */
	app_id = 1;
	/**
	 * 客户令牌
	 */
	c_api_token = 'c_api_token';
	/**
	 * 设置webview src地址 app_id 是你的应用id, c_api_token 是客户令牌
	 */
	webviewSrc = '';
	/**
	 * 设置webview 的样式 调试时 可以放大 上线时 设置为0
	 */
	webviewStyles = {
		width: '360px',
		height: '360px',
	};
	/**
	 * webview加载状态
	 */
	webviewLoadStatus = false;
	/**
	 * webviewRef实例
	 */
	webviewRef = null;
	/**
	 * 通讯事件方法
	 */
	events = {}
	/**
	 * 构造
	 */
	constructor(options) {
		this.debug = options.debug;
		this.host = options.host;
		this.app_id = options.app_id;
		this.c_api_token = options.c_api_token;
		this.webviewSrc = this.getWebviewSrc();
		this.webviewStyles = this.getWebviewStyles();
	}
	/**
	 * 获取webviewSrc地址
	 */
	getWebviewSrc() {
		return `https://${this.host}/ac/app/api/u/read/uniapp?app_id=${this.app_id}&c_api_token=${this.c_api_token}&debug=${this.debug}`;
	}
	/**
	 * 获取webviewStyles样式
	 */
	getWebviewStyles() {
		if (this.debug) {
			return {
				width: '360px',
				height: '360px',
			}
		}
		return {
			width: '1px',
			height: '1px',
		}
	}
	/**
	 * webview已加载方法
	 */
	webviewLoaded() {
		this.webviewLoadStatus = true;
	}
	/**
	 * 准备
	 */
	ready(webviewRef) {
		console.log('webview对象是:', webviewRef);
		this.webviewRef = webviewRef;
	}
	/**
	 * 查找访问者id
	 * @param {Number} s 
	 * @param {Function} callback
	 */
	findVid(s, callback) {
		//先通过剪切板获取一次
		this.findVidFromClipboard((vid) => {
			//如果取到了 直接回调
			if (vid != 0) {
				callback(vid);
				return;
			}
			//如果没有取到
			//判断webview 是否已加载 如果为加载
			if (this.webviewLoadStatus != true) {
				s--;
				if (s < 1) {
					callback(0);
					return;
				}
				setTimeout(() => {
					this.findVid(s, callback);
				}, 1000);
				return;
			}
			//如果已经加载了 调用框架的方法
			this.callIWebviewMethod('findVid', (vid) => {
				this.log('调用框架方法findVid的回调--:', vid);
				callback(vid);
			})
		})
	}
	/**
	 * 查找访问者id 从剪切板 vid标记
	 */
	findVidFromClipboardMark = false;
	/**
	 * 查找访问者id 从剪切板
	 */
	findVidFromClipboard(callback) {
		//是否从剪切板查找过
		if (this.findVidFromClipboardMark == true) {
			callback(0);
			return;
		}
		//this.findVidFromClipboardMark = true; //都会执行一次
		//如果没有从剪切板查找过 查找一次
		uni.getClipboardData({
			success: (res) => {
				this.log('获取剪切板内容为：', res.data);
				let content = 'css_ac_app_0_0';
				if (res.data) {
					content = res.data;
				}
				//正则解析
				//分析出访问者id
				let vids = content.match(/css_ac_app_([0-9]+)_([0-9]+)/);
				//vids[0] = 全字符 css_ac_app_1_9046389
				//vids[1] = 应用id 1
				//vids[2] = 访问者 9046389
				this.log('剪切板匹配到的访问者ids:', vids);
				//如果匹配到
				if (vids) {
					//是不是同一个应用id
					if (vids[1] == this.app_id) {
						this.log('是同一个应用id:', vids[1], '访问者id是:', vids[2]);
						callback(vids[2]);
						return;
					} else {
						this.log('不是一个应用id:', vids[1], '!=', this.app_id, '访问者id是:', vids[2]);
					}
				} else {
					this.log('未匹配到访问者信息');
				}
				callback(0);
			},
			fail: (err) => {
				this.log('获取剪切板内容失败：' + err);
				callback(0);
			}
		});
	}
	/**
	 * 获取访问者详情
	 */
	findV(vid, callback) {
		//请求地址
		let url =
			`https://${this.host}/ac/app/api/v/detail/${vid}?app_id=${this.app_id}&c_api_token=${this.c_api_token}`;
		this.log('请求访问者详情地址是:', url);
		uni.request({
			url: url,
			data: {},
			header: {
				'custom-header': 'hello'
			},
			success: (res) => {
				this.log('请求访问者详情结果:', res.data, res);
				if(res.data.code != 0){
					callback('');
					return;
				}
				callback(res.data.data);
			},
			fail: (err) => {
				this.log('请求访问者详情失败:', err);
				callback('')
			}
		});
	}

	/**
	 * 调用webview方法
	 */
	callIWebviewMethod(methodname, methodargs) {
		this.log('调用框架方法:', methodname, methodargs, this.webviewRef);
		try {
			//如果是findVid

			if (methodname == 'findVid') {

				this.events[methodname] = methodargs;

				this.webviewRef.evalJS(`
										    findVid((vid) => {
												//this.log('调用webview方法',findVid)
												uni.postMessage({
													data: {
														methodname: 'findVid',
														methodargs:vid
													}
												});
										    });
										`);
			}

			//下面方法好像无效 
			/*
			this.webviewRef.$refs['webviewRef'].postMessage({
				methodname: methodname,
				methodargs: methodname
			}, '*');
			*/
			/*
			this.webviewRef.postMessage({
				methodname: methodname,
				methodargs: args
			}, '*');
			*/
		} catch (e) {
			this.log('调用框架方法失败:', e);
		}
	}
	/**
	 * 设置一个webview的message监听方法
	 */
	webviewOnMessage(message) {
		this.log('WebView的消息是:', message);
		try {
			let methodname = message.detail.data[0]['methodname'];
			let methodargs = message.detail.data[0]['methodargs'];
			this.log('WebView的消息是:', '方法:', methodname, '参数:', methodargs);
			if (methodname == 'webviewLoaded') {
				this.webviewLoaded();
				return;
			}
			if (this.events[methodname]) {
				this.events[methodname](methodargs);
				return;
			}
		} catch (err) {
			this.log('WebView的消息异常:', err);
		}
	}
	/**
	 * 输出信息
	 */
	log(...params) {
		if (this.debug) {
			console.log('AcRegisterClass:', ...params);
		}
	}
}